<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">
  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
  <link rel="icon" type="image/png" sizes="32x32" href="/images/%E8%BF%AA.png">
  <link rel="icon" type="image/png" sizes="16x16" href="/images/%E8%BF%AA.png">
  <link rel="mask-icon" href="/images/logo.svg" color="#222">

<link rel="stylesheet" href="/css/main.css">


<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css">
  <link rel="stylesheet" href="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.css">

<script id="hexo-configurations">
    var NexT = window.NexT || {};
    var CONFIG = {"hostname":"zhengyidi.github.io","root":"/","scheme":"Pisces","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":true,"show_result":"flat","style":null},"back2top":{"enable":true,"sidebar":true,"scrollpercent":true},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
  </script>

  <meta name="description" content="设计模式 - 创建型 - 原型模式">
<meta property="og:type" content="article">
<meta property="og:title" content="11.原型模式">
<meta property="og:url" content="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/11.%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/index.html">
<meta property="og:site_name" content="Zhengyidi&#96;s 学习记录">
<meta property="og:description" content="设计模式 - 创建型 - 原型模式">
<meta property="og:locale" content="zh_CN">
<meta property="article:published_time" content="2021-07-11T00:00:00.000Z">
<meta property="article:modified_time" content="2021-11-13T14:58:22.502Z">
<meta property="article:author" content="zhengyidi">
<meta property="article:tag" content="设计模式">
<meta name="twitter:card" content="summary">

<link rel="canonical" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/11.%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/">


<script id="page-configurations">
  // https://hexo.io/docs/variables.html
  CONFIG.page = {
    sidebar: "",
    isHome : false,
    isPost : true,
    lang   : 'zh-CN'
  };
</script>

  <title>11.原型模式 | Zhengyidi`s 学习记录</title>
  






  <noscript>
  <style>
  .use-motion .brand,
  .use-motion .menu-item,
  .sidebar-inner,
  .use-motion .post-block,
  .use-motion .pagination,
  .use-motion .comments,
  .use-motion .post-header,
  .use-motion .post-body,
  .use-motion .collection-header { opacity: initial; }

  .use-motion .site-title,
  .use-motion .site-subtitle {
    opacity: initial;
    top: initial;
  }

  .use-motion .logo-line-before i { left: initial; }
  .use-motion .logo-line-after i { right: initial; }
  </style>
</noscript>

<link rel="alternate" href="/atom.xml" title="Zhengyidi`s 学习记录" type="application/atom+xml">
</head>

<body itemscope itemtype="http://schema.org/WebPage">
  <div class="container use-motion">
    <div class="headband"></div>

    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏">
      <span class="toggle-line toggle-line-first"></span>
      <span class="toggle-line toggle-line-middle"></span>
      <span class="toggle-line toggle-line-last"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/" class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <h1 class="site-title">Zhengyidi`s 学习记录</h1>
      <span class="logo-line-after"><i></i></span>
    </a>
      <p class="site-subtitle" itemprop="description">休对故人思故国，且将新火试新茶。诗酒趁年华。</p>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>




<nav class="site-nav">
  <ul id="menu" class="menu">
        <li class="menu-item menu-item-home">

    <a href="/" rel="section"><i class="fa fa-fw fa-home"></i>首页</a>

  </li>
        <li class="menu-item menu-item-tags">

    <a href="/tags/" rel="section"><i class="fa fa-fw fa-tags"></i>标签</a>

  </li>
        <li class="menu-item menu-item-categories">

    <a href="/categories/" rel="section"><i class="fa fa-fw fa-th"></i>分类</a>

  </li>
        <li class="menu-item menu-item-archives">

    <a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i>归档</a>

  </li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup">
        <div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div id="search-result">
  <div id="no-result">
    <i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
  </div>
</div>

    </div>
  </div>

</div>
    </header>

    


    <main class="main">
      <div class="main-inner">
        <div class="content-wrap">
          

          <div class="content post posts-expand">
            

    
  
  
  <article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://zhengyidi.github.io/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/11.%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="/images/avatar.gif">
      <meta itemprop="name" content="zhengyidi">
      <meta itemprop="description" content="">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="Zhengyidi`s 学习记录">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          11.原型模式
        </h1>

        <div class="post-meta">
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              <span class="post-meta-item-text">发表于</span>

              <time title="创建时间：2021-07-11 00:00:00" itemprop="dateCreated datePublished" datetime="2021-07-11T00:00:00+00:00">2021-07-11</time>
            </span>
              <span class="post-meta-item">
                <span class="post-meta-item-icon">
                  <i class="fa fa-calendar-check-o"></i>
                </span>
                <span class="post-meta-item-text">更新于</span>
                <time title="修改时间：2021-11-13 14:58:22" itemprop="dateModified" datetime="2021-11-13T14:58:22+00:00">2021-11-13</time>
              </span>
            <span class="post-meta-item">
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
                  <a href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" itemprop="url" rel="index"><span itemprop="name">设计模式</span></a>
                </span>
            </span>

          
            <div class="post-description">设计模式 - 创建型 - 原型模式</div>

        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">

      
        <div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Oh, this is an invalid password. Check and try again, please." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
  <script id="hbeData" type="hbeData" data-hmacdigest="21403ff613ec23942ad89f3d0ea50f997ab65c3c4d69d70fefe66b10f32499ed">22064b17c03cb0c0e58c99349b6889d0b31470871e725085fde7c8feed9af7ef9809dcebc3d02fc134a561361f8bf81c2489472fa757e1d568ce5e6ea73bb36464df563352d4d445965ed14f3caf17ace3e156cdce322f6b6240c0af50de1674b81f2f3c657fd461d6bc65470a6a2c3cbf63873ed57d291658b6a5ee917c34ceed38f2926bea66cf1e5740db52fb3d74a34a03e0fb6e881111c867a82b13a3298e87a61c7682072f19f96f513ee0e969691be73b6a1871df8db2e1871735bb76657e590676ac971f191a976a7405b416fcfc643243c911a0ec2a14f2292834efb78bd28876872c417140f3dd1fde6761d6879997670f91896077bee44522d15d2605adf67475638f21b1bba3b31970fa4726021912bf6268d070e1efaa4dbe5b3a28bbbde540ff39d6b9ddaaf8fae2bc4ac9016d1b60226d2be48bc7686a61c2820d66565068644f6429a66f81134a302553a3de2703e10e51e2f2088a2bf20c8430320a784c39ed03a4685540ac054f83bacc53d6bca4961bd051f26ee59726766bb015e28d9f880be222e9c7a02a1b07be180cb25d36589ad066f6b196ac3a4784bd2920b7da8474e5afd24af21f70652e6c24b2571b579381f3042dac6b9789c60935b076642e25a0d424be680f49e4f8112827cec4f99d7c89c6b4a8dbca747f59795e09bc050138a54db4c738cc8ebc3751ccb48b8d778fed45cc08201def86045c93f6ba39f422e6702fc0c0869ec8a5828ec4acd3126aed7b46b8687c736a796f4d07830ec9765b0d2cc41164a483383fe900e0761c5d8547cb3bba80de343cc7f4a673594829b58796563f0fc3d02e4dbada1ac8d3ba6d54c423c792c7ef121751eeb76408bf79f75496a8e4bd557f6dfe7b8720dcbf745576fca5af400500b610dcfbe69956f427d935a75e8d609a3585f4ed2653dc28a74cde5ca30411783fb3e2fa06b9a3b374ad5358204a2585afa2b6b2d1374865a6dd1be4add35049a6328e48faca3590c879365868e0613410e826af23c33995114a075ee7a1a024ba321947cacd10a8b0702dbcb0955b0814b8b8efec02c4fdc3cd704c838190524991765f025af06fc74ff30c9d8681a371f743d2e5f109685e85528c4ffe20bdd43e92a83ef9cc0d4165ba7f703e6785dd6098707120933b4f5e9c4acf3582c1e3be3cc00e17811aaaceac65f4c2262b59b551e28ef9787d59fe146b2d61c8efa6f0e81c71171924d1a75e0187d3066cb259b2c9ffc7978aac2e373980514fd42435171d88c8bc9bbddb3abc3eba8b6e0466c58caf4fda789b2d3b7036b36871f863f7d785c39d248a6fdd179e98973931a1f871a04caa68ec038ed98f0527a2b54a033332bc2308f04ea91b6f983f2b9d37ff008c1f76ef6e2e480fb82dc9e19381467c515fd18d239766f5d096e5f0afb4d3aa396f225cb35962943071295185b6ea41a99a9406e676fd2f85dbae9cb1ec007db928da23a34e522a606d58d651a0e1b25323f313a8deea83598e28a9ee6281c05fc6211c15b6e34c3c8c94dcf30b6365317be5079aba9099eb002449a6706eb4b9782ae3aa0ca1d210686ba6753f03df7f61d47e9b41fe899d06197e542ea925e36d76c843ec8f0c6ba1116a30110afc2aaafdaede9bd65e649d3b770455d79c972ec118c264c00cb45305df1b543c5d847d1d90a2c2befabdfb2ca13df7b17d9f6ee6a6dccdf7ba47b51cd5ce6e8d78f6c40a0fe63261ae1d2044339ef23d58d5613d57253a43f8d2858b746dc9afdacec5ad334370f7f3088b80b37ea4aff7907f811d9b7faea53549cdda8c0352498dd3573d363bec10bb4af63a2e75008e6c7dfc87bf3b99a4f6b411856e168019230f7f10db59b42d8db40bb902d80b81d6bd2a538116818b9d075b8c8805d9ff85b782d77385bcb7c8b28c8fa833bd6eea2a7ddf5501b6e6e5b48e0a21a0cfc15f53cc441dcdef624194134e690912b1f4dfced540a97773e3b2431a0b6df66cb28aa26b67ed71fc1d7e6fa7fd5ba279f87c7abc0361b8a92211b231a1341720e8759f8929e3ab36e678feb55f22fdfa57f9e23c9be74eacd1004125dc6e031fc787b3ecd4f704a8e8a4ff94aca2c2863ef1ba6e730294645f02bd76f5e17c8a50ec1ef385772b523bf654204f6175763c092ddbe8301334344f2e978129903628134bffead2e89eeba2e3de5917768ba3f7f9b8fb39f1938190247280741a117d13b4daf5e0c605918a9bbc8f44fd0c7e9c0d6f643e518cc0c0ee6f2e6a6a6f9259e138391bae993e2b25413da8ce9ab4a91f365af8aae280604fb2638996f8ca3536f5111375385160643a07a6cbc45cbaaae492fe23d3d01d7e8ba2eb97bca440c3fc010d347d65afd8cae31ad8123b94e351ae3e40ab5018e55c9728ff9f447a0d14419f0bee1420a0b9b15ef39558407fe8caa26de42fbfb5f996cd8811c4aa457b55e0713304cf5603b5452ebd793cc07d0c769648bf2a61ceb8943baf97210efeb3a1acc07f242dcd93474979666da72eec98062bf9c13970aef0c9d5ef9295320da256374a43cdbbc13ad6864d9438be010be5fef427a662b4f67c873c3563fabeb1a596098efc0d3622e389476456a183f3e0c025882aa3ea54aa00d524ab66c5386c015cc0ba5ad7a22c2d954d4ed1ce55637801490dd739f51b40336da0a1bbf140ac44a980581634d09e5d55228ec2604368c488e107de3927cef2e86015d377c16f865770f272aec0ca4c93ce115d7ce923b727e9eee4636b5485df5494e2353286ae8c6af8347e8c57dc63a01dddce80c8863c2511b60d3bd22bc714e541ebf0b9c6ffab9047af04a6f09d4d0afc46d43c1af071b894456d19c61e86a510420a9910f3c0283ab536ba5df160ac9f9e340aa4b945a62099444af1a080eecc726e119e8094795ec006d6c246b1cb9c4a2fcaf46f541d21296439f683ec53a5838e629e83f4128e5a4395456d5aeba25e08c48695208fb67bbaef7b198c3795ff6a5fbd5e3eac40e272232059cdec0e741c1534b3376c54609e56cd4e503e6e9aded06737e5effb54d0082d970b78da7a2d642fabfdfeda05703383b09b0694c3d7f796572c504e682699b674d1f1868ccc49ad5e6e28075c4ec9f3f344ee79d1703fd5ff80258359fd9d9c7e9d0fc2956a985d7a873269140d859535f4b195d7697370d08c12491c93ca490b4fbd577425a5b934e50adebd0a8cd2dfb75cdad4ae9f674cde2e77c9cc6de6306fea2e20ef3b20f45e93cedb1827a06f5afa95d4ddb9f86db9c847a0a1a92168cf06db9260b57de5a4b143c5865ffb256e13df4d941ec505bc8f832bb25a8bb6555332238b075d2b81d3dcbc309cd0f9f259eb3396f2e328f7c37edc5380f3f186e56b1da2394a5bb9aa7a835a39436259211f7cf8b2bf3f3092be32bfe3180c910b9b2b41ec5f535d9f2a04b866250187c48cd304babba7a673e09d7a7bdba0d129c870120f0161e5dec134311773700b590bd55d096a9f40d23870a07fb3230e8207ed8f4cd03c25bb1fc3e77783e7c3d2b053224ab42f7c1f6611ab407fb1a0e554ddbd554ea33f933a529583456e85c54a03373cc929d3d8e9eb2fc0c81e92564796908504d458ccc4d841b89f114e84a0ba80240143321743f13667e57788bbe2789e5f5858a1424036f62a6c43d45cfd388b4554ecc2badf3422044c32171ebe965c9ab2c23db16f4880f66a2ff5be55a43f674b7f6a83b370df52df2bbb65ffb46459753eaf37643721985d89afa69ae778ee8253fd2b90610b8a654c563224ea7eae1aaec9a9c8507f1de0c3b7a3c23433d5418f47589250295bd8d405674654e8ef7ec6f86cd9afc2d386dd972a733cf14e92b871544328c3746ad1782ed810be51101ff632362c4cb135b3912b3291e5d2365317866f093a19bec3e139b691eaa501991ac5eda2cbd56f21599ac17683a9822e8325c3362626b27d87b730a597c29821626a2cd3144c273d9f7cf29d9327f0429d8dde9492b4374b03be1e3fb6407ed5945eafbb78c6553f2f04c35786a46b00aa80da97902df59b6bf572cc592586aab263900b83fba5dd7fea9fc5ee010370c79b8056d475a1a6de83206b84e6a33bb79a4cf158c848c89172177d0dbff8a440db7e518f8800a1adbb7bbfa3b427420f56509e3eb16c7d5e37dce57df10dd8fb43b7b8f24efc34249085b1ff3b58a321b770eea61cf6eb35b23b67a928cd667d62abec5c74415ff072b46ed504a9f1e24aba9801852c82d4ff77310f0d228d8aab2e446a0a25734bee7965bb1041cee91fc46dfaf6394c616b870f02b499d8a43ab405a85f9706d944e6a7422f2d314275be6163044286d66359144e9053334645db8a2549629680398edc75b791c80178444b171a2a93281158a2e871fc8f57a634e28d32edfb808da009a266ee72fc8d03a08c93969e270f19c67ddf1e5e7b37446274ba1cc9542f60f3372f2d5582979fb656e64e10925e6fcc33c4929ae6992413d6c428eb29254a1664093d728ebbc580575180835f0bac9a87083f653111eceefa1a911cf91f35da0fb1850ecf5e341bcd0e798c2ee0278edb6bc43a1465d588f404780bf9bfb21028e841e68855282adebd262b80c77d40172e148e9a413a799c278610d236d8e7a0e80249c9545094ae6589bc37c63cbe9ff2c127433834721e15b77eaa34ca3afbfb4acbbfa6590924fd2f322736b987fe7cbad653176d78b95c5b26ad9ded0e7fc15feb48d1cd32a99d2c6141b111bae84d8e121a7540b7fa2d66752d2eaa8854ef9627fd18c1c66755a3e7370639a9e4b27ed3f491923d8c1890ce2e7c9ba88ee0c5a1b1fe3cd949ccefcf640f0f16beec38a51adf28b583ce628de67aa32510773e3ed4b31b7de78fee8a0552c172c9c95ef6f18beb08fe0ca5e7eadf495309a0ae3a2712d1f198bfd4e81026741a4e03c0245749f87c33df6521ab53c17b41e33cbcc52c68135d214f91f5f5feb8e17cdc1c70aca696d4fa282a7c87ca6e0e1f5a72cc67aecb3912c4e21eb668178cad3d116c12a35f989bd4c823a7cb445143329e7921614033112bbb641fa6ad0953bb005d84ab41ff34f4c6e97281e2526d3f9946253b910dccefc5dcb7512abe477ab0b0c5c11eeb10f960bbee7519980f57382197b1a6c6f2600f7a26b46c64950ad52b65b67d27d719acacab957d64e6e51afc3d3138f4761d14af3c51191a12b0172da4eaf0eab4071380dfd520551f1a665d2296ad7c7b9f2b9e33ba995e1066f8f1bf418ad85db94de62e271e34e974206129217cd883072d3bc1b779fb9c3693766571fbc106e263df35fdbecc307d5a778d248825e83ad43c5160366e7b7877f79e8129ea03bf8a9f2c3bc72a7a3dd69ae9aa6aebe90247e18ca68397756bde69119fc7a4bcd849455762ce8732d12eb78fa997a127d46694c77ffa6000ba5b38350dcd918a093cdb81fc8268bac7d5880ed9ade54753846f4b0f9de9542946116f03fefce9f72c3810875e42ad53b1b4233291e6e50c5fa35638a1dd630e9fb5b13f0ac5111c1f45e54cff164f733ba003e40033a4e372dd08183d7c5c0b94fe90b1d377955074c7e29e08d131209f19b8984733d31f00edcb265ea1e897b5d298c0ab0e25195297f593c171445a104e72a74000d50e6cb7df4d9fec59002c79146c2a9de1cb8e1f914b68bb725eb48dfdb46c4d1f58485a6522d9f3e6a99c567637009ce33aa4eb8017e63c3d8550a6920e9a670c7a275eacd46384db627f27fd40ec798ee40a249e4020d9a2ddd68c6214b93fa0a4763e5ca7941f5921d2b20581303319d0c706055a44db098347af6b2cf4335b3fe2ffe72dfdccdf2f0f5578f6a60f6f9847e6a0a9d59cb499de1c685c926aebb23e88c8ce12bdb64b2a09e28229f11e1c986e55ebe79abce08c5e3ac2425cf9376698c2247f4fb8caaa0220deb57344b25145cb6ef968d642630e5dd956f8d4aa5f710d492156819f975846a957cb99e18b80ad0e5c98b97e987bc50bb318da5765ae15d3caf63b5742470c20cdc2dd78a3b60faab37aa54b60648d9b379cf5c0630145080a8b593de397fadf592b5f605277e49563561e2865574412ba2bb4e1ac3308e823009d73113ce21c837d21465125fb4600511d452411b25c410ffc6c5bb5a6630208c344381efb1b2dd201819c3804f0f44cd2a6eeed41f649eb749ee5835b5e108781866568f3530c6d3eb6b2ca554943b419c6a5ddcf87fb0546339975fb25387424a0365a84cd6dd3b15444092270fa74134b0ab736f5c30116e024ca1a7d81a79833c593793465ff9e07f1cb5ae114e9ecb0d26c4e077a04d8605fb67db60e9dc4d748bbbd2ce8e488e902f157c1adf50918ad895d8f0708803f2313d72c7ab488fa14b122095eefd70fbd3df237aef218b8a43ef1bbd063c0ac7e0c00864b77e836354a5ebec6898230895a5cb074f01a4e3c90d8f470034c335de2c662d9355f9ee453ed2c9826959a977e6defdd5a3e3e065d74d15109714fc025bda72fff4472ce030c99892892b41a00ce92c1585ebc9e671019e2300a52898bd7420cb5714f8e1bf2047517a2a46fd84a80853f4e1524eb1467186ecf1d275c03856fb2581e359ba0e183a543c5a87147c1178a839fa766dffd53d2aec6ede9c69da3e80b1aa80e6bcf35c02396f0fde0b227dbcc5db2aab04e222b27dc6e77a1679063e5242d321f31daa812e7d554367cb9f6f5f76d3b21dff15aca2b7d541dfe61248608f4233c394be4162eeadba6e77fb078a40520d167d40eacbc5285e9339fd2ecfc8eeb3c02dc07f43c0ce8853c0cb176fd93ecb4e484d140eb22487e652076cf85bfd946ec8b682bc65848eded4ac57a04e6782476dcc3aaa40e7b33ff658b07740fe0bc94a98ac539690e947f59ee45f24e081e353042deb665a97bb9b9c73523d0fc92444fb53055e3bb0be3e85bd3ca08ff76b70ff173704e100476eaba34cc0f4d34f14fe86384e7e21f0727010468955458cd35d9ddb13679e294ecd24193a501afbce6752160449212dc84e33192d7bf908b41308343d97388ec942717b0be560d04222f67aadb1ea7c622cc2ff1af03f11e216c1b128e4206e4902f6b064840411e1de66c3a7c3b6ed5a5043026d2644d51f584d1ff0ed4c6a9f21c1fe9620acdac45c5b020dae3dd3b3422baddc80a136751a39cc876a6e21860eb4c10a82c0026694b374d43d9a928b8048d47d0968b4cae3c9ada5b14f1842c2787289d31c7040a0a0ec9fa842b1f904c33899214dd2f15f54619b1905161953a8feb7aab40df22fddc87b3af4421cea045ae168f7bac637e174284a3e2fcb8967f1b197bb1d5b3b95e6556f5282947e8570fdaa506a2a0560825c7e8c36088e7e40034df3a3ba80093210b217c607b719dcd427ee60948bee7f1b672a2aa93fbed926a080050b3140a838cb11d88b82055ffef3c1529c6920cbf381cc3291b0b64fdc966056c4eef87f1eab679bf4bf2ee296335eef695397f89e67d30ada73547265df436b3b39be7d4024db2bcc00992d24e2363f878644d0a21778dd22fc19911b67d47bd3a74c2712ef416715979a2c594a17cf7ba158184725fd0f028c4c499e47c196d9f316934bfe5fcf673a7b2b67ef403279b6e440ef78a3ef5bfa65ff0bfbe8e99af3f81b271a3805ff138e6e3352401d45809251b16c96257e84b5609b81c1e53e30fbfb652b1de5de378cd60daeeabdb0de7cf6c5e9af44067423f3d3a27cde1bf88d9fe8b0c7ecb03b40302eaa0ec79a2a645d352118c135264a1ee1e13a77c230280af886ac49e2f92a7a720683b97348485b5b96a624ed80edd61595210a7e6bc20345c387bfb72f87962e011961bac0a700f24eaecc37f6158f7b1e82c4efd7df2b220365f99abb74b78c74b6e65e326bb01ed4818af61c135d539da24549a284db188aba1a00cc467caa6193aac53170437cbdc554fa678e6c327de29b34b7b1ceb1ade74ecbf64e77392887c231c7c6ab513061f1dbea3e61652e9bf3a6df04bc98767dd66071cc4c17185395ae44454aad3a7337988f60b50a6bef8108ab8d1e3337aa3b37ca0b672541e74a1f55be4d0e681ea882904b5e4357d361a03ff56934c6c7268b3221a5f2d15eff418c28aece4cf1771db3383d3506c93a0cda25c1d1790a270e2ea997f352aa723392d5c52216d71ded2879d87781d92cf1766965995ada9158e86e42a1bddc79afc91d4e106f887c0f0127023441d97897b8da9d9a516936a99c2f3e15b6b65b444d7507af68571dda9cc0f1d3906aa759fdf2d4acd399baa950623ccbc24c1725ba03800ec38b71832df9af65b10815f86b953d20c80d28ced4c6446b06eaee843a0feb0258549b16f804b65e701c407b7859364b354c1cc3606a0808ecc8bb4439249442878778637abe5d6bc63382da5c98dc78128880057bc35350ee561894ba9b5f26995db1d5825a32ee9263331521b010d45479bef38a6f918255432c6aaabc51dba4cc3de99eecbcbd3ed887da130d06d4ae8f1047bb27ed98f3315716690b72dd097b7e0d242bda443e5f8cad4ac62a4c407cc3820e6359f2b32178f8a721ba0f1495d0db0be04dfadc99e006809a81ced5b4d5a521c4dbddca38d01d7ecc9100da2c22687263c8485314456861d1b3adeaf4338c377e2fc20bf66189305c984f8d0004349ee245863be7042fbb4c9c040eab25675eedf26f5d7bff4c4448cd46332a94117aea540aca51d921aecf0048900906b4d929b59d5e5c37f4a17fb7bac0600eeae70c0cf1b15e6b2539e06916ed36925edafa5209c283dc39a0be8abd5e15a4f0a44a44ae42f4d1e1acfc9b1e4641ddc16c4dba73e1a03c1073d6c7296fec49255dbe131b67e6ce8349ff35c845be20a15846cc487a9e995d84d4b69f4203bc6c93031f4ba91b0913eb556ea446a0876b2bb98af6352d4b5192014147019f0e2ebde78943e54960d5aade8dfedf635e98a9d45f87bf8a8d4fd2efd2fe0cd9cd5a31f84723364d717f2a46ff3a5d8b5b1cfed41eec6ae500473183fc859f5cc8411e80719bbff3968319ce3b2f7fed15625291d4780f0df43ea37f88c3582b5af14fcfd3308dde2fb53dca5b8ee733d0e05a8f98dc4b6c98147769834bcec346e7670ff4b93b1c8f080508704d27a103b8a9badc3aefca7d416757044551623570c332e8dd4b82ca48210be0175881a535fb7f07e25ef0930cbed3a7b1d4dada6097a1aef6b97263fcfcfad343f69054807dbb59f4a0a673b41cac7497ae055023bdbdbc760801f0037806d3fb981695438b4d91875101a2a557697f14e5d48ecf52df49b458aad51058a779e51f18341ba4998f6b679fcc7500af144d58fe72c9976f352b45af49e7feac6b3de6e86bd688d6dcba5e1467dfb7ce6c153edc463b6643691c2e5578981b629f287cd72953299a731ea93c939d6cd4573180f2c5ddba83fab1b3593807d40ebbaae84fd2335c9edecfcab9b7ad26cb4ac963ed28868db01a358747885d1be90898dba78805700809ff92380444fce06006b205ab469c587a1f054386d75ce7fdc824d14699ae21486cbc138fd98b58800729d5ab5a5a6a242d6ca30b871675b2d2a0a3ea34fe0d690b5367624445010b08d898d036eb7bb31ff338b3260c42ae3452acda823c39586a1a0113a1fa94113ada3b966894b000d5281d0ccd9fe65cfa096d8d69967965f1229309b18136536c9ddb3792ee58831f5fcc01938b6aa504a42e2afa1e2fc9fc53127d78014a24c94be8f43dfa8d30e2917079a855ed364a258bae625c4797c8b18d73b74a02a56bbdc775ed855d5ce4b1193c493bd7060e8bf219e9721c13a2c629356c96d9d112da5cbfbbec0e322a5dd0a7bf5beeb2d63c49b2b3605a0faea0946280df8f8355c69f4057a2c96c8987f8387b28d664c0e0c6ea8ae3f53297034e8f3db51166a371edd46a66b5fd3a245d277f9e926960c5318a94ef766708e0cdff83541b4f464f9efc470c5c3fbec30c5fc0ef037126d47cf42760b1f723c9eeb6d8e63317a0fb1608785d65775a4fa7fe6cfc36ca1b6cae2e58949c1352902eb40f4897957228fcee76a5db8b954923a32b0c28a138585f7b8b9a4231350b52d1c9c9e8ea9d29dae95b16b547e64182c722ebf66de56da79007d4b6fd7a06f63645a847ba30b9dc47b639e58dad5bc83f8ac69f567543d5bbea4257337d1797df3547e9ab2b6f5b5eca52ff915ecd96498783d8f5956bc7f82a94bafeefc053aa27c7a9c7b16424f61751bff21e44daf021e431e219a81cac54d35f6e5dc35a4b4d7f3267d6725239ed56f35a817c0cae43fd9d5b4b8ad571498701ffe78418a6b5bbbc9a2b2f4d9baf98119f19ee8c2349792d909e6d0118fb0b76d98c0cf0c387d92a476021dd8d07a425a7ebbc9e5bba6a19715c1a8cc5e77e1aed557d4d4629aa77c02107692c234be4ec2e7b0b340943c17a380f6a34196886f8182d2ef156f812573d7a72c99abee6c4f9df094db48f21f1e3b47a495817c13341cefacef4c868bedd76c830af8d258ef3010a40ca6c2b643da1b903c19447cf2e06425538f4b81d04d5f9768f735fbd5bd6096f61eb20225457241b6277a1396d22d2c91c365985967543819ea32f50b5b6db36523716eb32c3da312da60fa34b34599d860dbc828b6eaf27b0c45d641bacb02dfad2f0b8a393dc76d5249c7eaa30000dc2ca5ea69d26aa88b9860f890c28368dae219b45f9a6e64f132d6546c8e80e53972461733a0d1707f2664bccabc2e7d673c915f89a6c1bc45cfa549c954fe56990b6553987dde865537d172a612161db1b69c26b42423e6e90b517e84c6e8f22a4999a7aa9c807decbabb6b798e9e16405591d3c355b00c67bf7539a508651228ffe26846a1ca2ffc5e7eb2d6383b0055e9841ee49476581f7e7e0685b399555bce1e3add97eb5a4563a72e5da522675730226e684a7ed4be6e64b524a1dbb2ddaa617f8add01ad83d18269950c84960c3ebbedb6a8a534566c6958912bee0b7813c1f08bd1caaee6f82a25db6acad1cb1aee3aa090ea6faeab53e950d21a9f350a156448e07292a6ae0b0a9f6ca1029e58048350969ca69d29c39698313ce655184f5ba2ca198c80510acc35f4b77bbd80180009a78464280eb06ca1716c38b9ed23dedb3e2eef6fb8d5a9a217cbe3cc5ce44009ebc9d59c9b8be5b13fda1f705a319637f8c8c5300a2a17de88f4a55c642f439b0fb5cf2d6614aa7f0703cc972d0469ba2f4a4878f1af7657d0ca2bb888f9fa69375f7a43f6ed5a7edf1085af21e44bdacc5f705f265d5a477615f0d08f55c6291ffca09f749ed320ad634ba77420dfebd167484a8c63f3a28d8a040604def9ecce3f79890fe1743c79e7ba66cb9c72c5865f1f0b46b6eb83b24672dfc1824c51ca509efa9452f003b3080e2ab1649c613386b330fa1291131f994f57bdca75cfb812b7f39700565efae426439a5679ec29ae1cc96437d78f145dc068c7f873ac73f5bbed14740eaea5de16e636a31c848a1d2864e5e9487adb887e4b7278146a36aac881b876d17b9ebe50c851ef2544943c13d1171afd0f1efe66e19466b2e9432791542092a36050631aa619e732d944c4f5b096fcf265d1bb481eb60f41d22431d0894679b2e6dc663ab5340bd39c6fd50402cb5ec7af4ef856f16d174eb58993881776e77536eb2ac53d229283ed1c114ed5c965adc982ffc3e5b4aab0e194e34bd9ea78efa7df39317ee0cd8582d96915c4f3351c90a3358e3d267a6d7a469f884730bc289c1a91e45e4ed2c8d4fd10f9995f9c662758b3d3d5d188198def2f1e6d00b1be9f51e1989b0005b24327a62afa6322666b03e6b3caad254bbd97b54aeff52933c8e4f7226931931cabfaa0626efc9df040553a86d54bafb9ae43fec27068f271bbc76b8b484e33466a8f0f15580bdb3613ec5be1315a4fa9eee1f46d721ededca9759052f430fbc4f64172c5194ab15b7994c64c845c5b10ead474c6d0d68570fa1694e4d3925bb53d6343e6f12c276e6aceecbb9326aafaf2e3c35d4215cf8085e22c0d1325394d0f92c03149baaaf22b402841af648f1e2dd50efc17578955cc79dc4b924060bb86d926cc8a28714db96e21396ef3cc9ea9eb1307917435f668608d910431a86b03826023e0d1983036716d52e65d37d994a9cbd4cfeee95dc884930f108738337a5f3510818a4273a770ddde5c274635e3980a70b9112a160086a93bbc4a95dec31e29557f0163f413abf7f672251b83f35680167cffd30cafe9e8299c1d6a88f7a2779205e0853cf55224ddcf814f4a9b938977005680fe0f64b532da4229f93fa2e56679952e93d81c4b288734e06dc396d31af3b49317d069a4198eb36194643f24714c09195e67dbd7a0b0eebfdb7f9816d0efd6768b2da0f8f176c3c541cfe33b7db76a1056c66c9b4ee02b52181e4c7b02dd66bd21935880ee8e10ebf83b39b93da7eb142de840c1a87677bcaec119402795c78be05b016572f9c749a025d05fe8478ff12e3bab5a34ba0507f6e3bf70e2f270fffe32f0a96da6e05ada9ec60b6d9d14c61682713dc4ab3aedc03792327fe1b5affa7ff75f2847d227789e7917b890a2e6522e1372780267a60e5fa5c0f28e1b2b377bae1fb03ce54a64886c86daa6f54c16d871cff8b89322f1bf6e1ee10c0d486040057201be778ca48028dc338472312b1892e256eedf0df3b8a97f0ad740cf870a1bdba06ddeea24ec960886d22e499e2a2583df1bc98d269643c2c7f85543df1e24e1248c62464e090c1c07c3983a5384e5d7f8f1eaceb667a414f28a5bffda4396539bb4709ecb18ba5c0615f77e252091f05ae3d5ac56c685342ef1935a131a36650fac9525362d07fdef14b0e321624f96f00d0674d95cad80fb068b42f7f6cbffb0e43f52f1688af4f41b3df7ff7ec80f5ca845ddf62d45ea570d430cb906aff0b4b3a557f78dbfd18cc6bcb98bb129365754db62cde14e3ed7ebc9c0c6181fcd07b808c3ff8c798646b9b342beea9844b96b46de028f661a77249721fc51a94da663baa73cf6fad05c0783033b231f386d2c4a01fb780629ee26c0a88f9e6b7c83258a5aa7bb3429fa17ac47caf8f9e500cfd3bdccdfebd4f7d5a4648b0641a718a2a0cd197c0b11780d6ea562782e4688f3c2e92cdd887d293f8703c9370cd160985ebcd0dcaf46153e3c974664a94e3eacb9743e3733bf1dd2051c0469493127ae4fe3c82dcd5db154875cad11a5ded08189da88c898b82c1351713ff92e86b76cb4cb2cf529b875aed8833a780f0c997c7998397ce9495c642f17449f1eb0dea32afaf10cf5fe13cd814e22125904dca4054779205cc310fbf631906467e03f5bb46eb4f41d468b33b509fdefd90278e4033da58bc19a27840eebe78c6ff417d4cbba669dcf30c98fd2beb694c8af0ad6926836dd9f8dc9eeff8d8634b9cfba44c8ceff4810748fafefa19e9d9175c211b96e9932c5463850eea07e4987371820e8af808fd0699b8c2850ec267c038b4ad6892f644e42941ae422aa02433510a6768fdc7d850d55fd9a131f0a333e37a443c252c503e56a20b916e4aad3af1ab99cf6d73afd1092a851ea3675c7af732823444af8840dd025c8483540a39a3cddf25e9e788470cfd46ab12312aaa0922188e5c92ff5430b81c73096c0c6a63728434231a651a50d82818c10e15a32427b43efd33d30c8899c003a96481f84851787d6a3dcd909ee5852fa705416b6dd50ea059ad75c8db0d03a9432d9084b0f1beebd6fa410bddf2753839aacc957e9ef17022e5df4c0cebd51b0cf49a6d97212878ba803083fc297778539f74ce11212b55837373a0afd4b6da9fe58197775956e3b819ea034d80c7277dde6e4618592744d0adc7b3b706c539f507412b26fd7a91fe1894e4c4fd9cad2f5bb8983b767dbf61c0613f3871a2c40bf3001ba87b5aea9415a4696a9252f7f2c548539cc3d9fc1e76f92c603f448b229d8c601c70924d32d313408bc701fc6729bc33d625c40e72691d657b70430475c02fbcb30ef079dd132f7fd5c668bae14a86ef80187e8b786a19c06b84f37558337113df5ef85ede84f6461b19ea1d2a6f0dafaf7f8c0c64886df582c7c633225aaec76c712fab2fdd302b958c93b3bf19dd2ac603912774952d0731f2b0f706a5d7407a7fd0b6d079dbe55f7ddb62f2d7c111ea49fa0d86672ad950ccb42df606ad2a9deca6b55bb24e69d205252253b361fa6c6c924f92a77d1e18d1af5d9a48bd6e7a22a0b3147125ec01791aa8bbf0c0ac09429a2fb65f0934494c157575c1f8690327b1e6aaa3fea2d03a9bb4adbe3fc8cf1e070b27ff22d6b63044ecb7b41345393399a87f9d3ddf36f7868e0e013b8c41742f34937ed084f5953dc9e7eabe2352be123a17a9465aadb05f65d7b6db68ca157dfa0a0e314d8ec8b2c0d2770b9c1140f36b692a9a302e8363ea3f71d800fbce84bcb0e7b854036276ea52eb96f9ca270d21b249af381e6eef7dddbef18b431463edccf2468963dd08562ee59b6ee405f1c7060d0d16ea9829fed41e60be6a954f7c95d198a8d3fef81125bc1e573c005d6facf51276b3c855300fcee177b2a8e52d965892f477425b1a3c14a082f8a2f72b027a5bd76a3ae0e50781b5edaf051ed8f49797223e8bfde2128f6e84c8eb71e4cc4c5515c56de48fc05187c22cd5c5e338a95fe571a6356b548f61decfd188b97822e4e0eb5377f90f7aa450d686c222104e9ddf45174ad0bfdad0b6480e2551ce9d612deda92d4d5c2841a38634dd5ddbb50da67e8b6393c7af8986c703eee95da95142206388d9eabe99c5e7f4eab22a2a5c4e3ad60f7054a223e93ae2cf7c24608b42e59ecfe1c1d3dd0265ef6cc9678c18ae27d123dfda3df7f317fcbba8c173dbd7f2d68a4d3462a3deb98a6f43ed84853878afb5c7f416d97b1d0c2931191fcce5eced68c68b4a3e66c8136f40a0fe8d9cb7adfa443255d9540b706f535007d17d3158ea83ded78f804be5ff49d1bb14802a3462253b152067935d37b2c954e1ba9dc60b59537e50bf1fe9a238ec184b9fec3009811814fbf21fb2b28613df9730b44c571ea1b0052592035e8f6ed854d8c147490829fb5bc8e5553062d4ea25d6033d0c8b87b17d0d1f23d491bb2f120f1408b483edfc46f17b5b0b92a28898d8dfca726f30b23419afab4da82cbe87652870fa75f212d40ca40b352a5cf924c3ea63064842e0692985bff5116263ad147bd3e23243fae90b26f92236e47698d0648a67ff9eedaa17115217518d490a4f4b3080407a627da92c61e36e8885b88dfc956fee097e02d80b0cd10a65261d174948bd96b420d6cf9fcf17e1e24091e2ddce937165f5af9da8ce21d8504888123f0a8d0a5607bf83a26b99313db2bb4b4b74797ab24cd411f5611c3811c8132b4d768229bd9bd157f82d9b2ceb0d778d9e05e6fabf724ae0769045b9ebaf730129ebf18ece8ccadab9963a3d9b162d2138e9845f58db20974a504d1a2353cabb0c036621c14e6e0cd137ee006e3edff182675291e434edd3a0bb1142a29e883802276420891c52ed532a5a58283eb64ea9aa5eae0b4551ee9086e3db1175781256dc07ca00288b5c3a9275236b40623ee12f1d63c24cf01d33cf808d48f4d53b2fd3c0a0bf1540a18b73b4348ac21cc61c56c7a01c118dfb9d4d9b2995ac8933816f42fc0112bdf0e3d21ada000ad9f6d65db9328aacf86fa0bf7b98a14728be61a69cdfe1ea269b1c32c0e6a8ac90b4ddbfaef9fb225bcd7a5465af9620863ddfc9365ba33a1dc6cbd82c94e7d49ae4f8a8f5ad6fcf0a47eb2ddb308abe615fbc0d7d86bd5971069e359882d79f3f20fc3070c41aa87d67ef547c084db861c8da88151e2a0fce5741f659df837723cc5dcb55ec8fd36e7dcbb0ae1a46ee4a091632da8b913e1f94a7e2b83691d524ed9972e8e9de54b18325b405abadad159ac347b309c7ad7e32a7f8185d0fcabeb2c35d13d0d86d24ca67ae47cd5ff6cd84a16014a55f3b931c620c91740ae0ac2a9a8c8d9eb61b1462af14e48ad7ba0b959ef7e54b6b8a0540cce1469ce9e990afda477baff428c3e737ddacd56a92fb7270a4490848ee93633f2e5eb8421da6b5ec3a41fcd7a9f3f049554072d3fd8afa92c57fd853d1f1c1534a2767ff47efa0dcf08fd349336317a4d5c0b1d189bbea84d2b48f1bbe5931107ebb5be96cc074e82f5cc734717e02daa95343dd1b32c38775d9dbd9dfdf31a53ad4954b09e06f4e2b468c28945344aca01194a1282a3cba441261de99d8e294dd04886879c9ff9649599712018e07f6a0f53587de787137dbe4a6087901efe0f3a0f1a56dd97610687bcbb8a8bf672b61d3039f751feb3a673a3cc91dba6bda56c8011ecfc49d92978b22675979f9ee917d70399fdc84c1d25acf3d2b9721e2c2dd2f950a22617ba55c14463643acf6ffb8c4a9059f4d9343aed2376232f534c685b5cad4258f30fe0591e7543e557a422a301efe5b7bb1cdb97f32723dbe0e4cacd4a231ed1a1adddfea01d23ccce88a69da30c5ca0805d7d47a52a6007e9c3b2ec191a50c436d6793fdef4e826d2f17686906ff46e38d3c79f25b7b24704f94c7d7932f0952b9cf660c3d717fd0542246330e55220343073e330a1174f60b7e71e388e33bb18fcc4c6d4ee777708c92313c9943d925be4ced230db782d68b09d1d96ada7ba8b731cce8082f5c22440fcc1668cdaf58de8dccf25835c166282e0b8bce64afac9f09891b9951408079e7e0e773586cce982126857f299a9f69a720b02ff3f96d0ecbafca152081055a2ba3a3d2fc954dfa5a0e627b9688ac8094201b1d8e8d4ed556ba65857f69c7c29f3cc51387744d3ced631630cdcd5c0245df9338d2d0aadfc25857bee997c44f33d92f03545aa891dd137203be6651f36a4a3b03fb0addfcf321d13f29911e814ee8889949b7e95ec8b4798991d7c5928cde917cbebf9429aa21adf2caad0ef6344cf817e60553f6fa80090027757574bc8e9c0d94aef672404c3963eb70254be6cf4f730e687fb6b3fc38f02e82a4ee79bc9bbd1bc7cd1898ee5cf3859a04a63f6b468cda1381871f3efeb172f66cc1a989427ad24cbca0e14564ed584af45f1766a5bcaeef639660f2ee291055cfb8102c88d0886b7a8da6858d88833f624bf103e15b0a025f4196dcb176de67e45a8e0d3d2e338dd595ff693aa96e4e6dc54ae6ea4f06817e944c5d0612d6c9c402cdd7e9a777c4f3f826d45be84d4aebfab3b83f13dacb00dfdd4aee14527020eff7b53c4b8d18e5ea41d5ed9ac993f4faf471c0bceddc8d7285b0a3daf5d6dda0c9a666dd8ef05d7b06ec17d1b05d2f72f36d350ad09401518f584dc577d4f919082682e7ae2163465ef3b313d5a476cb7bec5469ebd0c30991943a27e9e074c20fbde5d90b17a312b24a0fc8d20a6af89cc81ff8b3f2df4f106e792a95449b615722f5a04935fcb8c52e42b56bfb14c6c2857cf81414794793883ded296f8ed345d00fb5f9ddd24adc0393892fe7825cc867a6d3ff654a94ae384e4647d90e9f4f45341c78b264e33d73576e3a3d7c244eda4b38af37a2e0896965e644094af904111d909c1b0e5afa3fd6cd492b50ec94a6258390c8f6bc55afa5549bfd9fd38cad3cae672b7dd8a7cf5f0f4141cca745c976c2e1ffacf5f5ca20e4858260076dce884d4fc5b4f2d81465b2e872e3564a942a06071f67f39d9f3faf99b1e5131932f104a35c0a7ddd193e7792461369ab493e2fe7fd9959b059609b047f9ab491cef8fd4bc3b94573e391c4a01c525df618e6f3bc5d59c60509e8d10f00441313b165da1f572a767b8fef98ce5e75d4c9ce34fc40911e78fcb3b9deb035b08a9d93f183375e73a739ae908052d88f39c92e3be89ddee2d14752dd3d242775c0aa79450268b68839fa10df9246f3fbf59e808f76947191fb1bd92dfc5d37d54bd89ec195cc550881f1636b6ede337eb8cc59389ad1b4fb01af2bb4afd7d64d3a7d8a799c7adaf54b632eb34ed9f9c882db04989890bff16c4588b811d851e26dadbda28e9c300fcfa66d3e3de13d111cd197cf52967c852e42fbb35917dce2ed49ecce89f43c7c332f61dace57a1c7b785c2572b00635437349ccfd4a15a7e1c2f1626d0258b3c5f6227ab0e37002b350467893d1a32279aba33c97be21446f3e758b6f3a70450cedb0fc8be1fcb4ee24472b08a0447fe541bfb8deb9576a0473bcb9117917e053afa6bc7ff2e0484b2791eee9050cdf9efa58eae93dd0c134b4ad5e9f9b7a1202f24da61414cf735cb3f8bad03a368b97bfc314e9401a8b15ca7054bbc9a27a2725eb24f428c78cef6400979e61f90f69fa13d3ce32b8c4d2910ba298bcd0111a4be77a974bf72318799c3bea9a175615944146c7caa1bed3117df32ab4e066ae5f3a850eb81118540ef77cd9d4dad47ab6245fac664daa9142817ff1707639b5df8557b48ac3b9255c32ea31b307a8919636e0b465c426cddb4d32eefa9fbc4005f68e37e14e3dc0d582fd964ae1abf0ae4d4909fe03b3681aa4af64b5566c2799d94666e5fe375af72e8aa3c81667c39bcf66a3adb3ed2b67728a2e27d84dcf0bd058178c47ccdc78434d082a9391789aac30dbda75a79e6531407ff2a67b49585c4270da8aa087a92e0949e0000dabdb02e2b2451f8adc4e83b46533b53c1d7fc713bc757d77afd085fce88f6ae0369bdcf3dfb1d963f1bc7437723cce2a335c60788876311141223df732acd4d86d9feeef2d81ce1bfc373b4658b9a1da5c60779a08a9e376234fc159663a4571086a89de661254b27dc681558b75cea3ee6f20dd8212210f01fb3f71907a462eb11ce2b8af9c09b4913ff99606977ee6c3ac4b713357aa23ac5f4381d3571f12b8ea3c315574b22dae75537963a3a6428ac85dae36ecea800cc21b3cf4989326b027cf6bf021cb47a7cb1212d6bca7f81d485249c1ec04565451e4a154556c1d3d85708854cbcce981014b1de3645aed9a7cb7f003b2fff701dd2ad8a07dce4c53f2ef43f19ef3c3dc588f2b80162d7faca1b621568b2dafc4dbc6d7cc46dbb021f8e8fdac4ce0af4a2afefb26962bea1b58608f741a2170aa07db0a9dd3fe06454bb2d763181f10666dc7df6c33ef2d03c4c3b00c52dbe0dc350b6d61778ae85b9152a59f99ea9d2758b6923beb1905774c1640648ee8f9a60dd93d7b904f6ef224381bbeaa234be268fd3b496e6c748624526649d354a2bdd00c612ee03fd20c93e65c60d29b1f866dc1e1f3d65aaaaee7b2e1d9e0c16da5e9b8c46afb5d8085cd60da10cbf45fb0cdf4852940aad7eb626a800d790dd9921f7e26abaa490858bd4365a958d0d87a3e5829843f0b90bdb1ed0869c3dc3606277188dfd5a0582b9f2b3e5e7f27bd84c5a3503599ab61b17ca2e30405d58c3478e8cb4942d159c6409fe17c44cf2f6bf8a19773edea2ee0b57cfc7253938434c219e0cec5cbaa362489717b7f9e1e3dbe37ff95cf7e3690769f9a0adce8c6201b31ac228fcec3c819c8525a4040cbacd51605a11e034c2c0486f3473e8ebb22a66e193f78860ce86bb5f0079887f16fed7a3bf84b3c468a72c1165211ab9314bf4e6deb107fb3f2e7928d08bc80e52a3a8bd9870bb540e04b5a7467eca629a9d5ab1fc7a4345d83540cea30001bfeb37acc4813a0fc1d00943f09aa405c4e9df50e3626f1442cf8e88f0ec3cbd522d5c29784ec03b652759d75450d7dc7456d8c375d99c0b6911b98ad2f03ec581ec8bffad88fb8edf3e31a88019cb7463d747e0e9b1d83c8f9c709aea743a665491e6abda551a27cc9a2add1fbdaaff52f8ff8b5321d1ce7b7d30f395340bca29b9aa3333aeb5f6a2f88182e59ecca7c670bfbabd07994ce510ff49eb0125b23148deb2f505bbd7fd6ba63a0ea4b21f620e371c7f49e4dd0901f14799bc197ca3cded6f6f6b3c136438b7b7147b09f289ca32c6798d8e4e4c6da51f7a51eaec6c0054aaa55e20b2072c315ffeac28e78264c66a8095a5cb8d514a20c1e1d906ef720ddc39a8cd86e301f5b92edb87eb8307bcb66ec78880083df01d50f53dacd32226e736ce9a8f53a0a7762b73fcc83e050164ee37ec5c339b888e91756faf26f2f2993dfb1603b1a95a729f717cfdf18eafd5b6dcd9fdde06f79146ba031f7299961ab3dd3855364328e6aee5c60de7b9b547f773853b4b4453c6ef4e5024b9a635cd2223878290ccd8f9bb1d87fa99e4994d05781949a65fc80f2836b9b99d0260cabbcba4eb1df090649def9d78c9fd6f0a8bbc07d70698215b6695885f0cb34ba6729b6153b6ec4df1f8ed1d8ffc466e99cf4a1ec6b530551bbd5bd584748719df82d5ffd3498082f0a272f45a447e8856808505702e7909a7d032ee4099cf745071d2013dde8f4057a7001dc0ccfa277d8660fea64ab1865ab1ffccc6a96054b76630d17386b0453ad6db07acc391c34e704ab1871164e0a87e2e6050a58659b8adb4685cc4f97b2dac6fc520ca0596d81f0c7a2c2dcea2f6a0198e5254868f8d78f84bc78f09589a9f9ce4704ccb54aad1e507b33da6f2328297ddfb79f86145c2a6064fb080da088b5295e7012ab68f1dcbd907f9427d58d96de0cc3453c39378eb095be4b17661de55d7ae77051d43c4091cb2e8df518119757f903c76c2f69470786e44540651f3a4d6a4ac61cbc40dc9a339537ae29adc517915592c6fb94acdfbb84313eedfd726d2b853c89db92f1f1eff96072fa03928c1eed9a92b88328e5559cea0e39f9647e027a07c839a3bfd1515a201a631fc6aeb952957a6127139bb6b17c2ff8aa5585cf3245d12fdacfbd796d571135c20eb5d8d8ba71e60beffe9be3e78c86857833a0b137596dbccdbfa73a0fc8188a0982530f11f4d20df8115412b6b72250610d78045fdef23451512040956db026db8de7274aac25e706b368af4baa27f6ba87b99ee0f01655c61f0167d8402ad93d3a3072df633e6915233bd00a683243880bf85dd165b5c27a07e780f26ef06b04daa360d57028a57e97a45409c5de4094523be4ebe05dc8493c7e34ed82a883eb405dab521523f5893cc6cd39eda4d7f560c504babc3ebefb35300d27dd8971ec314d81314c46257312930e9ab551bd17acbf95506ff6d219848e43234c1976673434b2cc5f0a4332043231670da099f57b583c25ad76a452e163de129418a66b30913361065e8be9cc4f656005fed671b80b2e</script>
  <div class="hbe hbe-content">
    <div class="hbe hbe-input hbe-input-default">
      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">
      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">
        <span class="hbe hbe-input-label-content hbe-input-label-content-default">Hey, password is required here.</span>
      </label>
    </div>
  </div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">
    </div>

    
    
    

      <footer class="post-footer">
          <div class="post-tags">
              <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" rel="tag"># 设计模式</a>
          </div>

        


        
    <div class="post-nav">
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/12.%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F/" rel="prev" title="12.代理模式">
      <i class="fa fa-chevron-left"></i> 12.代理模式
    </a></div>
      <div class="post-nav-item">
    <a href="/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/Design%20Pattern/10.%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/" rel="next" title="10.建造者模式">
      10.建造者模式 <i class="fa fa-chevron-right"></i>
    </a></div>
    </div>
      </footer>
    
  </article>
  
  
  



          </div>
          

<script>
  window.addEventListener('tabs:register', () => {
    let { activeClass } = CONFIG.comments;
    if (CONFIG.comments.storage) {
      activeClass = localStorage.getItem('comments_active') || activeClass;
    }
    if (activeClass) {
      let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
      if (activeTab) {
        activeTab.click();
      }
    }
  });
  if (CONFIG.comments.storage) {
    window.addEventListener('tabs:click', event => {
      if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
      let commentClass = event.target.classList[1];
      localStorage.setItem('comments_active', commentClass);
    });
  }
</script>

        </div>
          
  
  <div class="toggle sidebar-toggle">
    <span class="toggle-line toggle-line-first"></span>
    <span class="toggle-line toggle-line-middle"></span>
    <span class="toggle-line toggle-line-last"></span>
  </div>

  <aside class="sidebar">
    <div class="sidebar-inner">

      <ul class="sidebar-nav motion-element">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <!--noindex-->
      <div class="post-toc-wrap sidebar-panel">
      </div>
      <!--/noindex-->

      <div class="site-overview-wrap sidebar-panel">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
  <p class="site-author-name" itemprop="name">zhengyidi</p>
  <div class="site-description" itemprop="description"></div>
</div>
<div class="site-state-wrap motion-element">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/archives/">
        
          <span class="site-state-item-count">39</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/categories/">
          
        <span class="site-state-item-count">5</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/tags/">
          
        <span class="site-state-item-count">7</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author motion-element">
      <span class="links-of-author-item">
        <a href="https://github.com/zhengyidi" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;zhengyidi" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i>GitHub</a>
      </span>
      <span class="links-of-author-item">
        <a href="mailto:zhengyidi1357@gmail.com" title="Contact Me → mailto:zhengyidi1357@gmail.com" rel="noopener" target="_blank"><i class="fa fa-fw fa-envelope"></i>Contact Me</a>
      </span>
  </div>



      </div>
        <div class="back-to-top motion-element">
          <i class="fa fa-arrow-up"></i>
          <span>0%</span>
        </div>

    </div>
  </aside>
  <div id="sidebar-dimmer"></div>


      </div>
    </main>

    <footer class="footer">
      <div class="footer-inner">
        

        

<div class="copyright">
  
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">zhengyidi</span>
</div>

        








      </div>
    </footer>
  </div>

  
  <script src="/lib/anime.min.js"></script>
  <script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
  <script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
  <script src="/lib/velocity/velocity.min.js"></script>
  <script src="/lib/velocity/velocity.ui.min.js"></script>

<script src="/js/utils.js"></script>

<script src="/js/motion.js"></script>


<script src="/js/schemes/pisces.js"></script>


<script src="/js/next-boot.js"></script>




  




  
<script src="/js/local-search.js"></script>













  

  

</body>
</html>
<!-- 页面点击小红心 -->
<!-- <script type="text/javascript" src="/js/love.js"></script> -->
<!-- 鼠标悬浮 -->
<script type="text/javascript" src="/js/mouse-float.js"></script>

<!-- 鼠标点击爆炸效果 -->
<canvas class="fireworks" style="position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;" ></canvas> 
<script type="text/javascript" src="/js/fireworks/anime.min.js"></script> 
<script type="text/javascript" src="/js/fireworks/fireworks.js"></script>
